bitkeeper revision 1.20 (3e36c6bbUkBKPUFHEdbVYjpf-mrJ-w)
authorbd240@boulderdash.cl.cam.ac.uk <bd240@boulderdash.cl.cam.ac.uk>
Tue, 28 Jan 2003 18:06:51 +0000 (18:06 +0000)
committerbd240@boulderdash.cl.cam.ac.uk <bd240@boulderdash.cl.cam.ac.uk>
Tue, 28 Jan 2003 18:06:51 +0000 (18:06 +0000)
xen-2.4.16/common/domain.c
xen-2.4.16/common/memory.c
xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h
xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c
xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c

index 80b157ce787bf224ec9800000c6a5622edd386f2..8fd666ae5c03e703149bb4d1f991dd375fc5ac9b 100644 (file)
@@ -563,10 +563,12 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params)
     unsigned long phys_l1tab, phys_l2tab;
     unsigned long cur_address, alloc_address;
     unsigned long virt_load_address, virt_stack_address, virt_shinfo_address;
+    unsigned long virt_ftable_start, virt_ftable_end, ft_mapping;
     start_info_t  *virt_startinfo_address;
     unsigned long long time;
     unsigned long count;
     unsigned long alloc_index;
+    unsigned long ft_pages;
     l2_pgentry_t *l2tab, *l2start;
     l1_pgentry_t *l1tab = NULL;
     struct pfn_info *page = NULL;
@@ -620,10 +622,12 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params)
     p->mm.pagetable = mk_pagetable(phys_l2tab);
 
     /*
-     * NB. The upper limit on this loop does one extra page. This is to
-     * make sure a pte exists when we want to map the shared_info struct.
+     * NB. The upper limit on this loop does one extra page + pages for frame table. 
+     * This is to make sure a pte exists when we want to map the shared_info struct
+     * and frame table struct.
      */
 
+    ft_pages = (frame_table_size + (PAGE_SIZE - 1)) << PAGE_SHIFT;
     l2tab += l2_table_offset(virt_load_address);
     cur_address = p->pg_head << PAGE_SHIFT;
     for ( count  = 0;
@@ -681,6 +685,21 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params)
         (virt_load_address + ((alloc_index - 1) << PAGE_SHIFT));
     virt_stack_address  = (unsigned long)virt_startinfo_address;
 
+    /* set up frame_table mapping */
+    ft_mapping = (unsigned long)frame_table;
+    virt_ftable_start = virt_shinfo_address + PAGE_SIZE; 
+    virt_ftable_end = virt_ftable_start + frame_table_size;
+    for(cur_address = virt_ftable_start;
+        cur_address < virt_ftable_end;
+        cur_address += PAGE_SIZE){
+        l2tab = l2start + l2_table_offset(cur_address);
+        l1tab = map_domain_mem(l2_pgentry_to_phys(*l2tab));
+        l1tab += l1_table_offset(cur_address);
+        *l1tab = mk_l1_pgentry(__pa(ft_mapping)|L1_PROT);
+        unmap_domain_mem(l1tab);
+        ft_mapping += PAGE_SIZE;
+    }
+    
     unmap_domain_mem(l2start);
 
     /* Install the new page tables. */
@@ -701,6 +720,7 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params)
     virt_startinfo_address->pt_base = virt_load_address + 
         ((p->tot_pages - 1) << PAGE_SHIFT); 
     virt_startinfo_address->phys_base = p->pg_head << PAGE_SHIFT;
+    virt_startinfo_address->frame_table = virt_ftable_start;
 
     /* Add virtual network interfaces and point to them in startinfo. */
     while (params->num_vifs-- > 0) {
index cd7381ff7b56cbd4c64d718d2a0a4d52207b0214..4aa9c085d697b8e2b426e7f90dc3ba81ac006fa6 100644 (file)
@@ -826,7 +826,11 @@ int do_process_page_updates_bh(page_update_request_t * cur, int count)
 int do_process_page_updates(page_update_request_t *updates, int count)
 {
     page_update_request_t * pg_updates;
+    int ret;
 
     pg_updates = do_process_page_updates_uh(updates, count);
-    return do_process_page_updates_bh(pg_updates, count);
+    ret = do_process_page_updates_bh(pg_updates, count);
+    kfree(pg_updates);
+
+    return ret;
 }
index cde1fced959cabffd7ec4314b64ca74e37915080..9038d51d11f307daf5f893bd83fc82a362ee95dd 100644 (file)
@@ -200,6 +200,7 @@ typedef struct start_info_st {
     net_ring_t *net_rings;
     int num_net_rings;
     blk_ring_t *blk_ring;         /* block io communication rings */
+    unsigned long frame_table;
     unsigned char cmd_line[1];    /* variable-length */
 } start_info_t;
 
index fa3008dd9af1299710a1d9dafc81a3eff76cf91a..d9c33da28370910b47fbabbd8d914f1de4cab878 100644 (file)
@@ -40,6 +40,8 @@
 #define DOM_DIR         "dom"
 #define DOM_MEM         "mem"
 
+frame_table_t * frame_table;
+
 static struct proc_dir_entry *xeno_base;
 static struct proc_dir_entry *dom0_cmd_intf;
 static struct proc_dir_entry *proc_ft;
@@ -102,7 +104,11 @@ static ssize_t dom_mem_read(struct file * file, char * buff, size_t size, loff_t
 
     /* remap the range using xen specific routines */
 
+    printk(KERN_ALERT "bd240 debug: dmw entered %lx, %lx\n", mem_data->pfn, mem_data->tot_pages);
+
     addr = direct_mmap(mem_data->pfn << PAGE_SHIFT, mem_data->tot_pages << PAGE_SHIFT, prot, 0, 0);
+    
+    printk(KERN_ALERT "bd240 debug: dmw exit %lx, %lx\n", mem_data->pfn, mem_data->tot_pages);
 
     copy_to_user((unsigned long *)buff, &addr, sizeof(addr));
 
@@ -236,6 +242,8 @@ out:
 
 static int __init init_module(void)
 {
+    frame_table = (frame_table_t *)start_info.frame_table;
+    
     /* xeno proc root setup */
     xeno_base = proc_mkdir(XENO_BASE, &proc_root); 
 
index 1f62cbda7c135917c64730ba95038aca56c465d1..46b44deef3c36d8732e11df27816ba9d9b5838da 100644 (file)
@@ -187,8 +187,10 @@ unsigned long direct_mmap(unsigned long phys_addr, unsigned long size,
 
     /* and perform the mapping */
     if(flag == MAP_DISCONT){
+        printk(KERN_ALERT "bd240 debug: call direct_remap_disc_page_range\n");
         ret = direct_remap_disc_page_range(addr, phys_addr, tot_pages, prot);
     } else {
+        printk(KERN_ALERT "bd240 debug: call direct_remap_page_range\n");
         ret = direct_remap_page_range(addr, phys_addr, size, prot);
     }